# 面向对象
# 三大特征: 继承 多态 封装


# 多边形类 (基类,父类)
# 实例属性:n 边数, sides 每一条边的大小
class Polygon:
    def __init__(self, no_of_sides):
        self.n = no_of_sides
        self.sides = [0 for i in range(no_of_sides)]

    def inputSides(self):
        self.sides = [float(input("输入边长 "+str(i+1)+" : ")) for i in range(self.n)]

    def dispSides(self):
        for i in range(self.n):
            print("边长",i+1,"是",self.sides[i])

# 三角形类 继承 多边形类
# 三角形类(子类,派生类)
class Triangle(Polygon):
    def __init__(self):
        Polygon.__init__(self,3)

    def findArea(self):
        a, b, c = self.sides
        # 计算半周长
        s = (a + b + c) / 2
        area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
        print('三角形的面积是 %0.2f' %area)

t = Triangle()

# 尽管我们没有为类Triangle定义inputSides()或sides()之类的方法，但是我们能够使用它们。
# 如果在类中找不到属性，则搜索继续到基类。如果基类本身是从其他类派生的，则将以递归方式重复此操作。
t.inputSides()
t.dispSides()

t.findArea()

# 定义一个矩形类,继承多边形类,增加一个计算矩形面积的方法

# 继承,父类的方法是可以直接继承的,父类的属性需要显示的调用父类的构造函数才可以继承到